package com.Servlet;

import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.util.CellRangeAddress;

import com.jdbc.Jdbc;
import com.project.bean.Sales;

/**
 * Servlet implementation class checkinfoOutput_byclass
 */
@WebServlet("/checkinfoOutput_byclass")
public class checkinfoOutput_byclass extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public checkinfoOutput_byclass() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		int columns = 0;// 用于记录查询的表格中的属性值的个数
		String centername = request.getParameter("centername");
		String classname = request.getParameter("classname");
		String find = "select * from " + centername + classname + "check ";
		String month = request.getParameter("month");
		response.setContentType("application/octet-stream");
		response.setCharacterEncoding("UTF-8");
		// 首先得知道这个表格一共有几个属性列，也就是有几个日期，这样可以根据属性列的多少来分配表格数目
		String findtable = "select * from information_schema.columns where table_name='" + centername + classname
				+ "check'";
		Jdbc ft = new Jdbc();
		List<String> cn = new ArrayList<String>();// 用于存储表格中的列名
		List<String> monthdate = new ArrayList<String>();// 用于存储的就是当搜索的月的列表
		try {
			ft.Jdbc_Q2(findtable);

			while (ft.rs.next()) {
				columns++;// 用于记录表格中的属性的个数
				// 用于判断日期的属性列 monthdate用于存储该表中的日期属性
				// if (ft.rs.getString("is_nullable").equals("YES")) {
				// monthdate.add(ft.rs.getString("column_name"));
				// }
				if (ft.rs.getString("column_name").equals("absence")) {
					cn.add("presence");
				}
				else{
					cn.add(ft.rs.getString("column_name"));
				}

			}
			System.out.println("属性列个数：" + columns);
		} catch (ClassNotFoundException | SQLException e) {

			e.printStackTrace();
		}
		// ====================================================================================
		// 如果没有月份选择的话，那么就直接导出所有的数据
		if (month.equals("0")) {
			// 设置文件的名字
			response.addHeader("Content-Disposition", "attachment; filename=checkinfo.xls");
			String headline = centername + classname + "考勤信息(1代表出勤。0代表未出勤。2代表补签到)";

			// 创建EXCEL工作簿
			HSSFWorkbook workbook = new HSSFWorkbook();
			// 创建一个工作sheet
			HSSFSheet sheet = workbook.createSheet();
			CellStyle cellStyle = workbook.createCellStyle();
			DataFormat format = workbook.createDataFormat();
			cellStyle.setDataFormat(format.getFormat("@"));// 默认为文本格式
			// 创建第一行
			HSSFRow row = sheet.createRow(0);
			HSSFCell cell = null;
			// 创建标题
			sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 8));
			cell = row.createCell(0);
			cell.setCellValue(headline);
			// 创建第二行
			HSSFRow rowtitle = sheet.createRow(1);
			// 插入第二行的列属性，就是属性名
			int i = 0;
			// =================建立标题栏=====================
			for (String s : cn) {
				sheet.setDefaultColumnStyle(i, cellStyle);
				sheet.setColumnWidth(i, 20 * 256); // 设置sheet中第i列column宽度
				cell = rowtitle.createCell(i);
				cell.setCellValue(s);
				i++;
			}

			Jdbc j = new Jdbc();
			ResultSet rs = null;

			try {
				j.Jdbc_Q2(find);// 查找数据库中的数据
				// 已经知道数据库中，前四列都不是日期信息
				rs = j.rs;
			} catch (ClassNotFoundException | SQLException e1) {
				e1.printStackTrace();
			}

			i = 2;// 第三行开始才是数据

			try {
				while (rs.next()) {
					HSSFRow nextrow = sheet.createRow(i);
					int x = 1;// 用于检测循环时候列属性的个数
					while (x <= columns) {
						HSSFCell cell2 = nextrow.createCell(x - 1);

						cell2.setCellValue(rs.getString(x));
						x++;
					}

					i++;

				}
			} catch (SQLException e) {

				e.printStackTrace();
			}
			workbook.write(response.getOutputStream());
		}

		// =================================================================================================
		// 如果有日期选择的话那么就找到相应的月份并且输出这个月份的结果
		else {
			// 设置文件的名字
			response.addHeader("Content-Disposition", "attachment; filename=checkinfo.xls");
			String headline = centername + classname + "考勤信息(1代表出勤。0代表未出勤。2代表补签到)";

			// 创建EXCEL工作簿
			HSSFWorkbook workbook = new HSSFWorkbook();
			// 创建一个工作sheet
			HSSFSheet sheet = workbook.createSheet();
			CellStyle cellStyle = workbook.createCellStyle();
			DataFormat format = workbook.createDataFormat();
			cellStyle.setDataFormat(format.getFormat("@"));// 默认为文本格式
			// 创建第一行
			HSSFRow row = sheet.createRow(0);
			HSSFCell cell = null;
			// 创建标题
			sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 8));
			cell = row.createCell(0);
			cell.setCellValue(headline);
			// 创建第二行
			HSSFRow rowtitle = sheet.createRow(1);
			// 插入第二行的列属性，就是属性名
			int i = 0;

			for (String s : cn) {// 此for循环是为了建立表中的属性名行
				if (i < 4)// 前面一共有四个属性，0，1，2，3
				{
					sheet.setDefaultColumnStyle(i, cellStyle);
					sheet.setColumnWidth(i, 20 * 256);
					cell = rowtitle.createCell(i);
					cell.setCellValue(s);
					i++;
				}
				// 当i=6个时候代表开始遍历月的日期
				else {
					if (i >= 6) {
						String date = s.substring(5, 7);// 获取那天的月的数值
						if (date.equals(month)) {
							// 如果截取的日期和前台传过来的属性的值一样，那么就将这个值属性值添加到属性栏中去
							// 并且将需要查询的属性列添加到monthdate中去
							monthdate.add(s);// monthdate中存储的就是需要展示的属性列
							sheet.setDefaultColumnStyle(i-2, cellStyle);
							sheet.setColumnWidth(i-2, 20 * 256);
							cell = rowtitle.createCell(i-2);//使用i-2就是因为要将total和absence排除出去
							cell.setCellValue(s);
							i++;
						}
					}
					i++;
				}

			}
			i = 0;// 初始化，下面还会用到
			int monthdatecount = monthdate.size();
			Jdbc j = new Jdbc();
			ResultSet rs = null;
			// 将monthdate中的数据拼接起来以便select使用
			String findmonth = "";
			for (String s : monthdate) {
				findmonth = findmonth + s + ",";// 输出2018年01月23日 2018年01月24日 2018年01月21日的格式
			}
			try {
				findmonth = findmonth.substring(0, findmonth.length() - 1);// 将最后一个逗号去掉
			} catch (Exception e) {
				return;// 如果上步骤出错的话catch到就代表要下载的月份在数据库中不存在，所以就直接提交了
			}
			findmonth = findmonth + " ";// 给最后一个列名后面加上空格，使得查询语句正常
			// find =find.Remove(0,1);
			String find1 = "select stuid, stuname, centername, classname, " + findmonth + "from " + centername
					+ classname + "check" + "";
			try {
				j.Jdbc_Q2(find1);// 查找数据库中的数据
				// 已经知道数据库中，前6列都不是日期信息
				rs = j.rs;
			} catch (Exception e) {

			}

			i = 2;// 第三行开始才是数据

			try {
				// 此时的属性列的个数为
				columns = monthdatecount + 4;
				System.out.println("239属性列的个数为：" + columns);
				while (rs.next()) {
					HSSFRow nextrow = sheet.createRow(i);
					int x = 1;// 用于检测循环时候列属性的个数
					while (x <= columns) {
						HSSFCell cell2 = nextrow.createCell(x - 1);
						System.out.println(rs.getString(x));
						cell2.setCellValue(rs.getString(x));
						x++;
					}

					i++;

				}
			} catch (SQLException e) {

				e.printStackTrace();
			}
			workbook.write(response.getOutputStream());
		}
		// 创建一个文件

	}

}
